package main

import "fmt"

//func main() {
//	var mapChan chan map[string]string
//	mapChan = make(chan map[string]string, 10)
//	m1 := make(map[string]string, 20)
//	m1["city1"] = "北京"
//	m1["city2"] = "天津"
//	m2 := make(map[string]string, 20)
//	m2["hero1"] = "松江"
//	m2["hero2"] = "武松"
//	mapChan <- m1
//	mapChan <- m2
//
//	map1 := <-mapChan
//	map2 := <-mapChan
//
//	fmt.Printf("len(map1)=%v  len(map2)=%v", len(map1), len(map2))
//
//}

//func main() {
//	var intChan chan int
//	intChan = make(chan int, 3)
//	intChan <- 10
//	intChan <- 20
//	intChan <- 30
//	// 因为 intChan 的容量为 3，再存放会报 deadlock
//	// intChan <- 50
//	num1 := <-intChan
//	num2 := <-intChan
//	num3 := <-intChan
//	// 因为 intChan 这时已经没有数据了，再取就会报 deadlock
//	//num4 := <- intChan
//	fmt.Printf("num1=%v num2=%v num3=%v", num1, num2, num3)
//}

type Cat struct {
	Name string
	Age  int
}

//func main() {
//	var catChan chan *Cat
//	catChan = make(chan *Cat, 10)
//
//	cat1 := Cat{Name: "tom", Age: 10}
//	cat2 := Cat{Name: "tom~", Age: 100}
//	catChan <- &cat1
//	catChan <- &cat2
//	// 取出
//	cat11 := <- catChan
//	cat22 := <- catChan
//	fmt.Println(cat11, cat22)
//}

//func main() {
//	var catChan chan Cat
//	catChan = make(chan Cat, 10)
//
//	cat1 := Cat{Name: "tom", Age: 10}
//	cat2 := Cat{Name: "tom~", Age: 100}
//	catChan <- cat1
//	catChan <- cat2
//	// 取出
//	cat11 := <- catChan
//	cat22 := <- catChan
//	fmt.Println(cat11, cat22)
//}

func main() {
	//var allChan chan interface{}
	allChan := make(chan interface{}, 10)
	allChan <- 10         // 第1个变量
	allChan <- "tom jack" // 第2个变量
	cat := Cat{"小花猫", 4}
	allChan <- cat // 第3个变量
	// 我们希望获得到管道中的第三个元素，则先将前2个推出
	<-allChan
	<-allChan
	newCat := <-allChan //从管道中取出的Cat
	fmt.Printf("newCat=%T , newCat=%v\n", newCat, newCat)
	//下面的写法是错误的!编译不通过
	//fmt.Printf("newCat.Name=%v", newCat.Name)
	// 使用类型断言
	a := newCat.(Cat)
	fmt.Printf("newCat.Name=%v", a.Name)
}
